using System;

namespace PickGold.Zip
{
	/// <summary>
	/// An enum that provides the various encryption algorithms supported by this
	/// library.
	/// </summary>
	///
	/// <remarks>
	///
	/// <para>
	///   <c>PkzipWeak</c> implies the use of Zip 2.0 encryption, which is known to be
	///   weak and subvertible.
	/// </para>
	///
	/// <para>
	///   A note on interoperability: Values of <c>PkzipWeak</c> and <c>None</c> are
	///   specified in <see
	///   href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT">PKWARE's zip
	///   specification</see>, and are considered to be "standard".  Zip archives
	///   produced using these options will be interoperable with many other zip tools
	///   and libraries, including Windows Explorer.
	/// </para>
	///
	/// <para>
	///   Values of <c>WinZipAes128</c> and <c>WinZipAes256</c> are not part of the Zip
	///   specification, but rather imply the use of a vendor-specific extension from
	///   WinZip. If you want to produce interoperable Zip archives, do not use these
	///   values.  For example, if you produce a zip archive using WinZipAes256, you
	///   will be able to open it in Windows Explorer on Windows XP and Vista, but you
	///   will not be able to extract entries; trying this will lead to an "unspecified
	///   error". For this reason, some people have said that a zip archive that uses
	///   WinZip's AES encryption is not actually a zip archive at all.  A zip archive
	///   produced this way will be readable with the WinZip tool (Version 11 and
	///   beyond).
	/// </para>
	///
	/// <para>
	///   There are other third-party tools and libraries, both commercial and
	///   otherwise, that support WinZip's AES encryption. These will be able to read
	///   AES-encrypted zip archives produced by DotNetZip, and conversely applications
	///   that use DotNetZip to read zip archives will be able to read AES-encrypted
	///   archives produced by those tools or libraries.  Consult the documentation for
	///   those other tools and libraries to find out if WinZip's AES encryption is
	///   supported.
	/// </para>
	///
	/// <para>
	///   In case you care: According to <see
	///   href="http://www.winzip.com/aes_info.htm">the WinZip specification</see>, the
	///   actual AES key used is derived from the <see cref="ZipEntry.Password"/> via an
	///   algorithm that complies with <see
	///   href="http://www.ietf.org/rfc/rfc2898.txt">RFC 2898</see>, using an iteration
	///   count of 1000.  The algorithm is sometimes referred to as PBKDF2, which stands
	///   for "Password Based Key Derivation Function #2".
	/// </para>
	///
	/// <para>
	///   A word about password strength and length: The AES encryption technology is
	///   very good, but any system is only as secure as the weakest link.  If you want
	///   to secure your data, be sure to use a password that is hard to guess.  To make
	///   it harder to guess (increase its "entropy"), you should make it longer.  If
	///   you use normal characters from an ASCII keyboard, a password of length 20 will
	///   be strong enough that it will be impossible to guess.  For more information on
	///   that, I'd encourage you to read <see
	///   href="http://www.redkestrel.co.uk/Articles/RandomPasswordStrength.html">this
	///   article.</see>
	/// </para>
	///
	/// <para>
	///   The WinZip AES algorithms are not supported with the version of DotNetZip that
	///   runs on the .NET Compact Framework.  This is because .NET CF lacks the
	///   HMACSHA1 class that is required for producing the archive.
	/// </para>
	/// </remarks>
	public enum EncryptionAlgorithm
	{
		/// <summary>
		/// No encryption at all.
		/// </summary>
		None = 0,

		/// <summary>
		/// Traditional or Classic pkzip encryption.
		/// </summary>
		PkzipWeak,

#if AESCRYPTO
		/// <summary>
		/// WinZip AES encryption (128 key bits).
		/// </summary>
		WinZipAes128,

		/// <summary>
		/// WinZip AES encryption (256 key bits).
		/// </summary>
		WinZipAes256,
#endif

		/// <summary>
		/// An encryption algorithm that is not supported by DotNetZip.
		/// </summary>
		Unsupported = 4,


		// others... not implemented (yet?)
	}

}
